package cn.gson.oasys.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Created by ASUS on 2020/12/2.
 * Shiro权限控制
 */
@Configuration
public class ShiroConfig {
    //ShiroFilterFactoryBean:第三步
    @Bean
    public ShiroFilterFactoryBean getshiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean =new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);

        /*
        anon:无需认证就可以访问
        authc:必须认证了才能访问
        user:必须拥有了 记住我 功能才能用
        perms: 拥有对某个资源的权限才能访问
        role:拥有某个角色权限才能访问
         */
        Map<String,String> filterMap=new LinkedHashMap<>();

    //    filterMap.put("/index","authc");   //登录了才能看到index页面  支持通配符
        filterMap.put("/index","perms['aoaUser:index']");

   //     filterMap.put("/rwglzhuyemian","perms['renwuguanli/rwglzhuyemian']");   //超级管理员的roleId=1，可以看到所有页面

        //登录了才能看到index页面  支持通配符
        bean.setFilterChainDefinitionMap(filterMap);
        //未授权页面
        bean.setUnauthorizedUrl("/404");
        //设置登录的请求，让被拦截的页面调到登录页面
  //      bean.setLoginUrl("/login");  //写的参数是Controller对应跳转的@RequestMapping的值
        return bean;
    }


    //DafaulWebSecurityManager：第二步
    @Bean(name = "getDefaultWebSecurityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager =new DefaultWebSecurityManager();
        //关联Realm
        securityManager.setRealm(userRealm);

        return securityManager;
    }


    //创建Realm对象，需要自定义:第一步
    @Bean(name = "userRealm")
    public UserRealm userRealm(){
        return new UserRealm();
    }
}
